package com.zyl.blog.tasks.schedule.manager;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.tasks.schedule.manager
 * @ClassName: TaskManager
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/8/12-10:24
 */

import com.zyl.blog.common.domain.task.vo.TaskOperationResult;
import com.zyl.blog.tasks.enums.TaskType;
import com.zyl.blog.tasks.schedule.abstracts.AbstractScheduledTask;

import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Map;

/**
 * 任务管理器接口，负责任务的注册、启动、暂停等操作
 */
public interface TaskManager {

    /**
     * 注册任务
     */
    TaskOperationResult registerTask(AbstractScheduledTask task);

    /**
     * 启动任务
     */
    TaskOperationResult startTask(String taskName, String username);

    /**
     * 暂停任务
     */
    TaskOperationResult pauseTask(String taskName, String username);

    /**
     * 销毁任务
     */
    TaskOperationResult destroyTask(String taskName, String username, Boolean status);

    /**
     * 重新加载任务
     */
    TaskOperationResult reloadTask(String taskName, String username);

    /**
     * 批量操作方法
     */
    Map<String, TaskOperationResult> batchStartTasks(List<String> taskNames, String username);
    Map<String, TaskOperationResult> batchPauseTasks(List<String> taskNames, String username);
    Map<String, TaskOperationResult> batchDestroyTasks(List<String> taskNames, String username);
    Map<String, TaskOperationResult> batchRestoreTasks(List<String> taskNames, String username);

    // 调度策略更新
    TaskOperationResult updateTaskSchedule(
            String taskName,
            String username,
            TaskType scheduleType,
            String cronExpression,
            Long interval,
            ChronoUnit timeUnit
    );

    /**
     * 一键操作所有任务
     */
    Map<String, TaskOperationResult> startAllTasks(String username);
    Map<String, TaskOperationResult> pauseAllTasks(String username);

    /**
     * 扫描并注册所有任务
     */
    void scanAndRegisterTasks();

    /**
     * 获取用户的所有任务
     */
    List<AbstractScheduledTask> getUserTasks(String username);

    /**
     * 检查任务是否正在运行
     */
    boolean isTaskRunning(String taskName, String username);

    /**
     * 恢复任务（原Impl方法提升到接口）
     */
    TaskOperationResult restoreTask(String taskName, String username);

    /**
     * 获取用户的所有任务（包括已删除的）
     */
    List<AbstractScheduledTask> getUserAllTasks(String username);
}

